﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	// Проверка прав доступа должна располагаться самой первой.
	Если Не ПравоДоступа("Администрирование", Метаданные) Тогда
		ВызватьИсключение НСтр("ru = 'Использование обработки в интерактивном режиме доступно только администратору.'");
	КонецЕсли;
	
	ПроверитьВерсиюИРежимСовместимостиПлатформы();
	
	Объект.ЭтоИнтерактивныйРежим = Истина;
	Объект.БезопасныйРежим = Истина;
	Объект.КодировкаФайлаПротоколаОбмена = "КодировкаТекста.UTF8";
	
	ЗаголовокФормы = НСтр("ru = 'Универсальный обмен данными в формате XML (%ВерсияОбработки%)'");
	ЗаголовокФормы = СтрЗаменить(ЗаголовокФормы, "%ВерсияОбработки%", ВерсияОбъектаСтрокойНаСервере());
	
	Заголовок = ЗаголовокФормы;
	
	ЗаполнитьСписокТиповДоступныхДляУдаления();
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Элементы.ИмяФайлаПравил.СписокВыбора.ЗагрузитьЗначения(ПравилаОбмена.ВыгрузитьЗначения());
	Элементы.ИмяФайлаОбмена.СписокВыбора.ЗагрузитьЗначения(ЗагрузкаДанныхИхФайла.ВыгрузитьЗначения());
	Элементы.ИмяФайлаДанных.СписокВыбора.ЗагрузитьЗначения(ВыгрузкаДанныхВФайл.ВыгрузитьЗначения());
	
	ПриИзмененииПериода();
	
	ПриИзмененииТипаУдаленияРегистрацииИзменений();
	
	ОчиститьДанныеОФайлеДляЗагрузкиДанных();
	
	ПрямаяВыгрузка = ?(Объект.НепосредственноеЧтениеВИБПриемнике, 1, 0);
	
	СохраненныйРежимЗагрузки = (Объект.РежимОбмена = "Загрузка");
	
	Если СохраненныйРежимЗагрузки Тогда
		
		// Нужную страницу устанавливаем.
		Элементы.ГлавнаяПанельФормы.ТекущаяСтраница = Элементы.ГлавнаяПанельФормы.ПодчиненныеЭлементы.Загрузка;
		
	КонецЕсли;
	
	ОбработатьДоступностьЭлементовУправленияТранзакциями();
	
	РазвернутьСтрокиДерева(УдаляемыеДанные, Элементы.УдаляемыеДанные, "Пометка");
	
	АрхивироватьФайлПриИзмененииЗначения();
	ПрямаяВыгрузкаПриИзмененииЗначения();
	
	#Если ВебКлиент Тогда
		Элементы.СтраницыОтладкиВыгрузки.ТекущаяСтраница = Элементы.СтраницыОтладкиВыгрузки.ПодчиненныеЭлементы.ГруппаВыгрузкаВебКлиент;
		Элементы.СтраницыОтладкиЗагрузки.ТекущаяСтраница = Элементы.СтраницыОтладкиЗагрузки.ПодчиненныеЭлементы.ГруппаЗагрузкаВебКлиент;
		Объект.ФлагРежимОтладкиОбработчиков = Ложь;
		
		ЭтоКлиент = Истина;
		Элементы.РежимОбработки.Доступность = Ложь;
	#КонецЕсли
	
	ИзменитьРежимОбработки(ЭтоКлиент);
	
	УстановитьДоступностьКомандОтладки();
	
	Если СохраненныйРежимЗагрузки
		И Объект.НастройкаАвтоматическойЗагрузкиДанных <> 0 Тогда
		
		Если Объект.НастройкаАвтоматическойЗагрузкиДанных = 1 Тогда
			
			ОписаниеОповещения = Новый ОписаниеОповещения("ПриОткрытииЗавершение", ЭтотОбъект);
			ПоказатьВопрос(ОписаниеОповещения, НСтр("ru = 'Выполнить загрузку данных из файла обмена?'"), РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да);
			
		Иначе
			
			ПриОткрытииЗавершение(КодВозвратаДиалога.Да, Неопределено);
			
		КонецЕсли;
		
	КонецЕсли;
	
	Если Не ЭтоWindowsКлиент() Тогда
		Элементы.ГруппаОС.ТекущаяСтраница = Элементы.ГруппаОС.ПодчиненныеЭлементы.ГруппаLinux;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытииЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = КодВозвратаДиалога.Да Тогда
		
		ВыполнитьЗагрузкуИзФормы();
		ПредставлениеПериодаВыгрузки = ПредставлениеПериода(Объект.ДатаНачала, Объект.ДатаОкончания);
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура АрхивироватьФайлПриИзменении(Элемент)
	
	АрхивироватьФайлПриИзмененииЗначения();
	
КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПравилОбменаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ВыборФайла(Элемент, ЭтотОбъект, "ИмяФайлаПравил", Истина, , Ложь, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПравилОбменаОткрытие(Элемент, СтандартнаяОбработка)
	
	ОткрытьВПриложении(Элемент.ТекстРедактирования, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ПрямаяВыгрузкаПриИзменении(Элемент)
	
	ПрямаяВыгрузкаПриИзмененииЗначения();
	
КонецПроцедуры

&НаКлиенте
Процедура ГлавнаяПанельФормыПриСменеСтраницы(Элемент, ТекущаяСтраница)
	
	Если ТекущаяСтраница.Имя = "Выгрузка" Тогда
		
		Объект.РежимОбмена = "Выгрузка";
		
	ИначеЕсли ТекущаяСтраница.Имя = "Загрузка" Тогда
		
		Объект.РежимОбмена = "Загрузка";
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ФлагРежимОтладкиПриИзменении(Элемент)
	
	Если Объект.ФлагРежимОтладки Тогда
		
		Объект.ИспользоватьТранзакции = Ложь;
				
	КонецЕсли;
	
	ОбработатьДоступностьЭлементовУправленияТранзакциями();

КонецПроцедуры

&НаКлиенте
Процедура КоличествоОбработанныхОбъектовДляОбновленияСтатусаПриИзменении(Элемент)
	
	Если Объект.КоличествоОбработанныхОбъектовДляОбновленияСтатуса = 0 Тогда
		Объект.КоличествоОбработанныхОбъектовДляОбновленияСтатуса = 100;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаОбменаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ВыборФайла(Элемент, ЭтотОбъект, "ИмяФайлаОбмена", Ложь, , Объект.АрхивироватьФайл);
	
КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПротоколаОбменаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ВыборФайла(Элемент, Объект, "ИмяФайлаПротоколаОбмена", Ложь, "txt", Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПротоколаОбменаЗагрузкаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ВыборФайла(Элемент, Объект, "ИмяФайлаПротоколаОбменаЗагрузка", Ложь, "txt", Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаДанныхНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ВыборФайла(Элемент, ЭтотОбъект, "ИмяФайлаДанных", Ложь, , Объект.АрхивироватьФайл);
	
КонецПроцедуры

&НаКлиенте
Процедура КаталогИнформационнойБазыДляПодключенияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
	
	ДиалогВыбораФайла.Заголовок = НСтр("ru = 'Выберите каталог информационной базы'");
	ДиалогВыбораФайла.Каталог = Объект.КаталогИнформационнойБазыДляПодключения;
	ДиалогВыбораФайла.ПроверятьСуществованиеФайла = Истина;
	
	Оповещение = Новый ОписаниеОповещения("КаталогИнформационнойБазыДляПодключенияОбработкаВыбора", ЭтотОбъект);
	ДиалогВыбораФайла.Показать(Оповещение);
	
КонецПроцедуры

&НаКлиенте
Процедура КаталогИнформационнойБазыДляПодключенияОбработкаВыбора(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	
	Если ВыбранныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Объект.КаталогИнформационнойБазыДляПодключения = ВыбранныеФайлы[0];
	
КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПротоколаОбменаОткрытие(Элемент, СтандартнаяОбработка)
	
	ОткрытьВПриложении(Элемент.ТекстРедактирования, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПротоколаОбменаЗагрузкаОткрытие(Элемент, СтандартнаяОбработка)
	
	ОткрытьВПриложении(Элемент.ТекстРедактирования, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура КаталогИнформационнойБазыДляПодключенияОткрытие(Элемент, СтандартнаяОбработка)
	
	ОткрытьВПриложении(Элемент.ТекстРедактирования, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура АутентификацияWindowsИнформационнойБазыДляПодключенияПриИзменении(Элемент)
	
	Элементы.ПользовательИнформационнойБазыДляПодключения.Доступность = НЕ Объект.АутентификацияWindowsИнформационнойБазыДляПодключения;
	Элементы.ПарольИнформационнойБазыДляПодключения.Доступность = НЕ Объект.АутентификацияWindowsИнформационнойБазыДляПодключения;
	
КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПравилПриИзменении(Элемент)
	
	Файл = Новый Файл(ИмяФайлаПравил);
	
	Оповещение = Новый ОписаниеОповещения("ИмяФайлаПравилПослеПроверкиСуществования", ЭтотОбъект);
	Файл.НачатьПроверкуСуществования(Оповещение);
	
КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПравилПослеПроверкиСуществования(Существует, ДополнительныеПараметры) Экспорт
	
	Если Не Существует Тогда
		СообщитьПользователю(НСтр("ru = 'Не найден файл правил обмена'"), "ИмяФайлаПравил");
		УстановитьПризнакЗагрузкиПравил(Ложь);
		Возврат;
	КонецЕсли;
	
	Если ИменаФайловПравилИОбменаСовпадают() Тогда
		Возврат;
	КонецЕсли;
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ИмяФайлаПравилПриИзмененииЗавершение", ЭтотОбъект);
	ПоказатьВопрос(ОписаниеОповещения, НСтр("ru = 'Загрузить правила обмена данными?'"), РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да);
	
КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПравилПриИзмененииЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = КодВозвратаДиалога.Да Тогда
		
		ВыполнитьЗагрузкуПравилОбмена();
		
	Иначе
		
		УстановитьПризнакЗагрузкиПравил(Ложь);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаОбменаОткрытие(Элемент, СтандартнаяОбработка)
	
	ОткрытьВПриложении(Элемент.ТекстРедактирования, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаОбменаПриИзменении(Элемент)
	
	ОчиститьДанныеОФайлеДляЗагрузкиДанных();
	
КонецПроцедуры

&НаКлиенте
Процедура ИспользоватьТранзакцииПриИзменении(Элемент)
	
	ОбработатьДоступностьЭлементовУправленияТранзакциями();
	
КонецПроцедуры

&НаКлиенте
Процедура ФлагРежимОтладкиОбработчиковЗагрузкиПриИзменении(Элемент)
	
	УстановитьДоступностьКомандОтладки();
	
КонецПроцедуры

&НаКлиенте
Процедура ФлагРежимОтладкиОбработчиковВыгрузкиПриИзменении(Элемент)
	
	УстановитьДоступностьКомандОтладки();
	
КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаДанныхОткрытие(Элемент, СтандартнаяОбработка)
	
	ОткрытьВПриложении(Элемент.ТекстРедактирования, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаДанныхПриИзменении(Элемент)
	
	Если ПустоеЗначениеРеквизита(ИмяФайлаДанных, "ИмяФайлаДанных", Элементы.ИмяФайлаДанных.Заголовок)
		Или ИменаФайловПравилИОбменаСовпадают() Тогда
		Возврат;
	КонецЕсли;
	
	Объект.ИмяФайлаОбмена = ИмяФайлаДанных;
	
	Файл = Новый Файл(Объект.ИмяФайлаОбмена);
	Объект.АрхивироватьФайл = (ВРЕГ(Файл.Расширение) = ВРЕГ(".zip"));
	
КонецПроцедуры

&НаКлиенте
Процедура ТипИнформационнойБазыДляПодключенияПриИзменении(Элемент)
	
	ТипИнформационнойБазыДляПодключенияПриИзмененииЗначения();
	
КонецПроцедуры

&НаКлиенте
Процедура ВерсияПлатформыИнформационнойБазыДляПодключенияПриИзменении(Элемент)
	
	Если ПустаяСтрока(Объект.ВерсияПлатформыИнформационнойБазыДляПодключения) Тогда
		
		Объект.ВерсияПлатформыИнформационнойБазыДляПодключения = "V8";
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузкиПриИзменении(Элемент)
	
	ПриИзмененииТипаУдаленияРегистрацииИзменений();
	
КонецПроцедуры

&НаКлиенте
Процедура ПериодВыгрузкиПриИзменении(Элемент)
	
	ПриИзмененииПериода();
	
КонецПроцедуры

&НаКлиенте
Процедура ПериодУдаленияПриИзменении(Элемент)
	
	ПриИзмененииПериода();
	
КонецПроцедуры

&НаКлиенте
Процедура БезопаснаяЗагрузкаПриИзменении(Элемент)
	
	ИзменитьРежимБезопаснаяЗагрузка();
	
КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПравилЗагрузкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ВыборФайла(Элемент, ЭтотОбъект, "ИмяФайлаПравилЗагрузки", Истина, , Ложь, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПравилЗагрузкиПриИзменении(Элемент)
	
	ПоместитьФайлПравилЗагрузкиВХранилище();
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыТаблицаПравилВыгрузки

&НаКлиенте
Процедура ТаблицаПравилВыгрузкиПередНачаломИзменения(Элемент, Отказ)
	
	Если Элемент.ТекущийЭлемент.Имя = "СсылкаНаУзелОбмена" Тогда
		
		Если Элемент.ТекущиеДанные.ЭтоГруппа Тогда
			Отказ = Истина;
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаПравилВыгрузкиПриИзменении(Элемент)
	
	Если Элемент.ТекущийЭлемент.Имя = "ПВД" Тогда
		
		ТекСтрока = Элемент.ТекущиеДанные;
		
		Если ТекСтрока.Включить = 2 Тогда
			ТекСтрока.Включить = 0;
		КонецЕсли;
		
		УстановитьПометкиПодчиненных(ТекСтрока, "Включить");
		УстановитьПометкиРодителей(ТекСтрока, "Включить");
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыУдаляемыеДанные

&НаКлиенте
Процедура УдаляемыеДанныеПриИзменении(Элемент)
	
	ТекСтрока = Элемент.ТекущиеДанные;
	
	УстановитьПометкиПодчиненных(ТекСтрока, "Пометка");
	УстановитьПометкиРодителей(ТекСтрока, "Пометка");

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ТестПодключения(Команда)
	
	ВыполнитьПодключениеКИБПриемникуНаСервере();
	
КонецПроцедуры

&НаКлиенте
Процедура ПолучитьИнформациюОФайлеОбмена(Команда)
	
	АдресФайла = "";
	
	Если ЭтоКлиент Тогда
		
		ОписаниеОповещения = Новый ОписаниеОповещения("ПолучитьИнформациюОФайлеОбменаЗавершение", ЭтотОбъект);
		НачатьПомещениеФайла(ОписаниеОповещения, АдресФайла, , , УникальныйИдентификатор);
		
	Иначе
		
		ПолучитьИнформациюОФайлеОбменаЗавершение(Истина, АдресФайла, "", Неопределено);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПолучитьИнформациюОФайлеОбменаЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
	
	Если Результат Тогда
		
		Попытка
			
			ОткрытьФайлЗагрузкиНаСервере(Адрес);
			ПредставлениеПериодаВыгрузки = ПредставлениеПериода(Объект.ДатаНачала, Объект.ДатаОкончания);
			
		Исключение
			
			СообщитьПользователю(НСтр("ru = 'Не удалось прочитать файл обмена.'"));
			ОчиститьДанныеОФайлеДляЗагрузкиДанных();
			
		КонецПопытки;
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура УдалениеОтметитьВсе(Команда)
	
	Для Каждого Строка Из УдаляемыеДанные.ПолучитьЭлементы() Цикл
		
		Строка.Пометка = 1;
		УстановитьПометкиПодчиненных(Строка, "Пометка");
		
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура УдалениеОтменитьВсе(Команда)
	
	Для Каждого Строка Из УдаляемыеДанные.ПолучитьЭлементы() Цикл
		Строка.Пометка = 0;
		УстановитьПометкиПодчиненных(Строка, "Пометка");
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура УдалениеУдалить(Команда)
	
	ОписаниеОповещения = Новый ОписаниеОповещения("УдалениеУдалитьЗавершение", ЭтотОбъект);
	ПоказатьВопрос(ОписаниеОповещения, НСтр("ru = 'Удалить выбранные данные в информационной базе?'"), РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет);
	
КонецПроцедуры

&НаКлиенте
Процедура УдалениеУдалитьЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = КодВозвратаДиалога.Да Тогда
		
		УдалитьНаСервере();
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВыгрузкаОтметитьВсе(Команда)
	
	Для Каждого Строка Из Объект.ТаблицаПравилВыгрузки.ПолучитьЭлементы() Цикл
		Строка.Включить = 1;
		УстановитьПометкиПодчиненных(Строка, "Включить");
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ВыгрузкаОтменитьВсе(Команда)
	
	Для Каждого Строка Из Объект.ТаблицаПравилВыгрузки.ПолучитьЭлементы() Цикл
		Строка.Включить = 0;
		УстановитьПометкиПодчиненных(Строка, "Включить");
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ВыгрузкаОчиститьУзлыОбмена(Команда)
	
	УстановитьУзелОбменаУСтрокДереваНаСервере(Неопределено);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыгрузкаУстановитьУзелОбмена(Команда)
	
	Если Элементы.ТаблицаПравилВыгрузки.ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	УстановитьУзелОбменаУСтрокДереваНаСервере(Элементы.ТаблицаПравилВыгрузки.ТекущиеДанные.СсылкаНаУзелОбмена);
	
КонецПроцедуры

&НаКлиенте
Процедура СохранитьПараметры(Команда)
	
	СохранитьПараметрыНаСервере();
	
КонецПроцедуры

&НаКлиенте
Процедура ВосстановитьПараметры(Команда)
	
	ВосстановитьПараметрыНаСервере();
	
КонецПроцедуры

&НаКлиенте
Процедура НастройкаОтладкиВыгрузки(Команда)
	
	Объект.ИмяФайлаПравилОбмена = ИмяФайлаНаСервереИлиКлиенте(ИмяФайлаПравил, АдресФайлаПравилВХранилище);
	
	ОткрытьФормуНастройкиОтладкиОбработчиков(Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура НаКлиенте(Команда)
	
	Если Не ЭтоКлиент Тогда
		
		ЭтоКлиент = Истина;
		
		ИзменитьРежимОбработки(ЭтоКлиент);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура НаСервере(Команда)
	
	Если ЭтоКлиент Тогда
		
		ЭтоКлиент = Ложь;
		
		ИзменитьРежимОбработки(ЭтоКлиент);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура НастройкаОтладкиЗагрузки(Команда)
	
	АдресФайлаОбменаВХранилище = "";
	ИмяФайлаДляРасширения = "";
	
	Если ЭтоКлиент Тогда
		
		ОписаниеОповещения = Новый ОписаниеОповещения("НастройкаОтладкиЗагрузкиЗавершение", ЭтотОбъект);
		НачатьПомещениеФайла(ОписаниеОповещения, АдресФайлаОбменаВХранилище, , , УникальныйИдентификатор);
		
	Иначе
		
		Если ПустоеЗначениеРеквизита(ИмяФайлаОбмена, "ИмяФайлаОбмена", Элементы.ИмяФайлаОбмена.Заголовок) Тогда
			Возврат;
		КонецЕсли;
		
		НастройкаОтладкиЗагрузкиЗавершение(Истина, АдресФайлаОбменаВХранилище, ИмяФайлаДляРасширения, Неопределено);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура НастройкаОтладкиЗагрузкиЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
	
	Если Результат Тогда
		
		Объект.ИмяФайлаОбмена = ИмяФайлаНаСервереИлиКлиенте(ИмяФайлаОбмена ,Адрес, ВыбранноеИмяФайла);
		
		ОткрытьФормуНастройкиОтладкиОбработчиков(Ложь);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьВыгрузку(Команда)
	
	ВыполнитьВыгрузкуИзФормы();
	
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьЗагрузку(Команда)
	
	ВыполнитьЗагрузкуИзФормы();
	
КонецПроцедуры

&НаКлиенте
Процедура ПрочитатьПравилаОбмена(Команда)
	
	Если Не ЭтоWindowsКлиент() И ПрямаяВыгрузка = 1 Тогда
		ПоказатьПредупреждение(,НСтр("ru = 'Прямое подключение к информационной базе поддерживается только в клиенте под управлением ОС Windows.'"));
		Возврат;
	КонецЕсли;
	
	ИмяФайлаДляРасширения = "";
	
	Если ЭтоКлиент Тогда
		
		Если Не ПустаяСтрока(АдресФайлаПравилВХранилище)
			И ЭтоАдресВременногоХранилища(АдресФайлаПравилВХранилище) Тогда
			УдалитьИзВременногоХранилища(АдресФайлаПравилВХранилище);
			АдресФайлаПравилВХранилище = "";
		КонецЕсли;
		
		ОписаниеОповещения = Новый ОписаниеОповещения("ПрочитатьПравилаОбменаЗавершение", ЭтотОбъект);
		НачатьПомещениеФайла(ОписаниеОповещения, АдресФайлаПравилВХранилище, , , УникальныйИдентификатор);
		
	Иначе
		
		АдресФайлаПравилВХранилище = "";
		Если ПустоеЗначениеРеквизита(ИмяФайлаПравил, "ИмяФайлаПравил", Элементы.ИмяФайлаПравил.Заголовок) Тогда
			Возврат;
		КонецЕсли;
		
		ПрочитатьПравилаОбменаЗавершение(Истина, АдресФайлаПравилВХранилище, ИмяФайлаДляРасширения, Неопределено);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПрочитатьПравилаОбменаЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
	
	Если Результат Тогда
		
		АдресФайлаПравилВХранилище = Адрес;
		
		ВыполнитьЗагрузкуПравилОбмена(Адрес, ВыбранноеИмяФайла);
		
		Если Объект.ФлагОшибки Тогда
			
			УстановитьПризнакЗагрузкиПравил(Ложь);
			
		Иначе
			
			УстановитьПризнакЗагрузкиПравил(Истина);
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Открывает файл обмена во внешнем приложении.
//
// Параметры:
//  
// 
&НаКлиенте
Процедура ОткрытьВПриложении(ИмяФайла, СтандартнаяОбработка = Ложь)
	
	СтандартнаяОбработка = Ложь;
	
	ДополнительныеПараметры = Новый Структура();
	ДополнительныеПараметры.Вставить("ИмяФайла", ИмяФайла);
	ДополнительныеПараметры.Вставить("ОписаниеОповещения", Новый ОписаниеОповещения);
	
	Файл = Новый Файл(ИмяФайла);
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПослеОпределенияСуществованияФайла", ЭтотОбъект, ДополнительныеПараметры);
	Файл.НачатьПроверкуСуществования(ОписаниеОповещения);
	
КонецПроцедуры

// Продолжение процедуры (см. выше).
&НаКлиенте
Процедура ПослеОпределенияСуществованияФайла(Существует, ДополнительныеПараметры) Экспорт
	
	Если Существует Тогда
		НачатьЗапускПриложения(ДополнительныеПараметры.ОписаниеОповещения, ДополнительныеПараметры.ИмяФайла);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьДанныеОФайлеДляЗагрузкиДанных()
	
	Объект.ВерсияПравилОбмена = "";
	Объект.ДатаВыгрузкиДанных = "";
	ПредставлениеПериодаВыгрузки = "";
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьДоступностьЭлементовУправленияТранзакциями()
	
	Элементы.ИспользоватьТранзакции.Доступность = НЕ Объект.ФлагРежимОтладки;
	
	Элементы.КоличествоОбъектовНаТранзакцию.Доступность = Объект.ИспользоватьТранзакции;
	
КонецПроцедуры

&НаКлиенте
Процедура АрхивироватьФайлПриИзмененииЗначения()
	
	Если Объект.АрхивироватьФайл Тогда
		ИмяФайлаДанных = СтрЗаменить(ИмяФайлаДанных, ".xml", ".zip");
	Иначе
		ИмяФайлаДанных = СтрЗаменить(ИмяФайлаДанных, ".zip", ".xml");
	КонецЕсли;
	
	Элементы.ПарольДляСжатияФайлаОбмена.Доступность = Объект.АрхивироватьФайл;
	
КонецПроцедуры

&НаСервере
Процедура УстановитьУзелОбменаУСтрокДерева(Дерево, УзелОбмена)
	
	Для Каждого Строка Из Дерево Цикл
		
		Если Строка.ЭтоГруппа Тогда
			
			УстановитьУзелОбменаУСтрокДерева(Строка.ПолучитьЭлементы(), УзелОбмена);
			
		Иначе
			
			Строка.СсылкаНаУзелОбмена = УзелОбмена;
			
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Функция ИменаФайловПравилИОбменаСовпадают()
	
	Если ВРег(СокрЛП(ИмяФайлаПравил)) = ВРег(СокрЛП(ИмяФайлаДанных)) Тогда
		
		СообщитьПользователю(НСтр("ru = 'Файл правил обмена не может совпадать с файлом данных.
		|Выберите другой файл для выгрузки данных.'"));
		Возврат Истина;
		
	Иначе
		
		Возврат Ложь;
		
	КонецЕсли;
	
КонецФункции

// Заполняет дерево метаданных, доступных для удаления.
&НаСервере
Процедура ЗаполнитьСписокТиповДоступныхДляУдаления()
	
	ДеревоДанных = РеквизитФормыВЗначение("УдаляемыеДанные");
	
	ДеревоДанных.Строки.Очистить();
	
	СтрокаДерева = ДеревоДанных.Строки.Добавить();
	СтрокаДерева.Представление = НСтр("ru = 'Справочники'");
	
	Для каждого ОбъектМД Из Метаданные.Справочники Цикл
		
		Если Не ПравоДоступа("Удаление", ОбъектМД) Тогда
			Продолжить;
		КонецЕсли;
		
		СтрокаМД = СтрокаДерева.Строки.Добавить();
		СтрокаМД.Представление = ОбъектМД.Имя;
		СтрокаМД.Метаданные = "СправочникСсылка." + ОбъектМД.Имя;
		
	КонецЦикла;
	
	СтрокаДерева = ДеревоДанных.Строки.Добавить();
	СтрокаДерева.Представление = НСтр("ru = 'Планы видов характеристик'");
	
	Для каждого ОбъектМД Из Метаданные.ПланыВидовХарактеристик Цикл
		
		Если Не ПравоДоступа("Удаление", ОбъектМД) Тогда
			Продолжить;
		КонецЕсли;
		
		СтрокаМД = СтрокаДерева.Строки.Добавить();
		СтрокаМД.Представление = ОбъектМД.Имя;
		СтрокаМД.Метаданные = "ПланВидовХарактеристикСсылка." + ОбъектМД.Имя;
		
	КонецЦикла;
	
	СтрокаДерева = ДеревоДанных.Строки.Добавить();
	СтрокаДерева.Представление = НСтр("ru = 'Документы'");
	
	Для каждого ОбъектМД Из Метаданные.Документы Цикл
		
		Если Не ПравоДоступа("Удаление", ОбъектМД) Тогда
			Продолжить;
		КонецЕсли;
		
		СтрокаМД = СтрокаДерева.Строки.Добавить();
		СтрокаМД.Представление = ОбъектМД.Имя;
		СтрокаМД.Метаданные = "ДокументСсылка." + ОбъектМД.Имя;
		
	КонецЦикла;
	
	СтрокаДерева = ДеревоДанных.Строки.Добавить();
	СтрокаДерева.Представление = "РегистрыСведений";
	
	Для каждого ОбъектМД Из Метаданные.РегистрыСведений Цикл
		
		Если Не ПравоДоступа("Изменение", ОбъектМД) Тогда
			Продолжить;
		КонецЕсли;
		
		Подчинен = (ОбъектМД.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору);
		Если Подчинен Тогда Продолжить КонецЕсли;
		
		СтрокаМД = СтрокаДерева.Строки.Добавить();
		СтрокаМД.Представление = ОбъектМД.Имя;
		СтрокаМД.Метаданные = "РегистрСведенийЗапись." + ОбъектМД.Имя;
		
	КонецЦикла;
	
	ЗначениеВРеквизитФормы(ДеревоДанных, "УдаляемыеДанные");
	
КонецПроцедуры

// Возвращает версию обработки.
&НаСервере
Функция ВерсияОбъектаСтрокойНаСервере()
	
	Возврат РеквизитФормыВЗначение("Объект").ВерсияОбъекта();
	
КонецФункции

&НаКлиенте
Процедура ВыполнитьЗагрузкуПравилОбмена(АдресФайлаПравилВХранилище = "", ИмяФайлаДляРасширения = "")
	
	Объект.ФлагОшибки = Ложь;
	
	ЗагрузитьПравилаОбменаИПараметрыНаСервере(АдресФайлаПравилВХранилище, ИмяФайлаДляРасширения);
	
	Если Объект.ФлагОшибки Тогда
		
		УстановитьПризнакЗагрузкиПравил(Ложь);
		
	Иначе
		
		УстановитьПризнакЗагрузкиПравил(Истина);
		РазвернутьСтрокиДерева(Объект.ТаблицаПравилВыгрузки, Элементы.ТаблицаПравилВыгрузки, "Включить");
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура РазвернутьСтрокиДерева(ДеревоДанных, ПредставлениеНаФорме, ИмяФлажка)
	
	СтрокиДерева = ДеревоДанных.ПолучитьЭлементы();
	
	Для Каждого Строка Из СтрокиДерева Цикл
		
		ИдентификаторСтроки=Строка.ПолучитьИдентификатор();
		ПредставлениеНаФорме.Развернуть(ИдентификаторСтроки, Ложь);
		ВключитьРодителяЕслиВключеныПодчиненные(Строка, ИмяФлажка);
		
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ВключитьРодителяЕслиВключеныПодчиненные(СтрокаДерева, ИмяФлажка)
	
	Включить = СтрокаДерева[ИмяФлажка];
	
	Для Каждого ПодчиненнаяСтрока Из СтрокаДерева.ПолучитьЭлементы() Цикл
		
		Если ПодчиненнаяСтрока[ИмяФлажка] = 1 Тогда
			
			Включить = 1;
			
		КонецЕсли;
		
		Если ПодчиненнаяСтрока.ПолучитьЭлементы().Количество() > 0 Тогда
			
			ВключитьРодителяЕслиВключеныПодчиненные(ПодчиненнаяСтрока, ИмяФлажка);
			
		КонецЕсли;
		
	КонецЦикла;
	
	СтрокаДерева[ИмяФлажка] = Включить;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененииПериода()
	
	Объект.ДатаНачала = ПериодВыгрузки.ДатаНачала;
	Объект.ДатаОкончания = ПериодВыгрузки.ДатаОкончания;
	
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьПравилаОбменаИПараметрыНаСервере(АдресФайлаПравилВХранилище, ИмяФайлаДляРасширения)
	
	ИмяФайлаПравилОбмена = ИмяФайлаНаСервереИлиКлиенте(ИмяФайлаПравил ,АдресФайлаПравилВХранилище, ИмяФайлаДляРасширения);
	
	Если ИмяФайлаПравилОбмена = Неопределено Тогда
		
		Возврат;
		
	Иначе
		
		Объект.ИмяФайлаПравилОбмена = ИмяФайлаПравилОбмена;
		
	КонецЕсли;
	
	ОбъектДляСервера = РеквизитФормыВЗначение("Объект");
	ОбъектДляСервера.ТаблицаПравилВыгрузки = РеквизитФормыВЗначение("Объект.ТаблицаПравилВыгрузки");
	ОбъектДляСервера.ТаблицаНастройкиПараметров = РеквизитФормыВЗначение("Объект.ТаблицаНастройкиПараметров");
	
	ОбъектДляСервера.ЗагрузитьПравилаОбмена();
	ОбъектДляСервера.ИнициализироватьПервоначальныеЗначенияПараметров();
	ОбъектДляСервера.Параметры.Очистить();
	Объект.ФлагОшибки = ОбъектДляСервера.ФлагОшибки;
	
	Если ЭтоКлиент Тогда
		
		УдалитьФайлы(Объект.ИмяФайлаПравилОбмена);
		
	КонецЕсли;
	
	ЗначениеВРеквизитФормы(ОбъектДляСервера.ТаблицаПравилВыгрузки, "Объект.ТаблицаПравилВыгрузки");
	ЗначениеВРеквизитФормы(ОбъектДляСервера.ТаблицаНастройкиПараметров, "Объект.ТаблицаНастройкиПараметров");
	
КонецПроцедуры

// Открывает диалог выбора файла.
//
&НаКлиенте
Процедура ВыборФайла(Элемент, ОбъектХранения, ИмяСвойства, ПроверятьСуществование, Знач РасширениеПоУмолчанию = "xml",
	АрхивироватьФайлДанных = Истина, ВыборФайлаПравил = Ложь)
	
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

	Если РасширениеПоУмолчанию = "txt" Тогда
		
		ДиалогВыбораФайла.Фильтр = "Файл протокола обмена (*.txt)|*.txt";
		ДиалогВыбораФайла.Расширение = "txt";
		
	ИначеЕсли Объект.РежимОбмена = "Выгрузка" Тогда
		
		Если АрхивироватьФайлДанных Тогда
			
			ДиалогВыбораФайла.Фильтр = "Архивный файл данных (*.zip)|*.zip";
			ДиалогВыбораФайла.Расширение = "zip";
			
		ИначеЕсли ВыборФайлаПравил Тогда
			
			ДиалогВыбораФайла.Фильтр = "Файл данных (*.xml)|*.xml|Архивный файл данных (*.zip)|*.zip";
			ДиалогВыбораФайла.Расширение = "xml";
			
		Иначе
			
			ДиалогВыбораФайла.Фильтр = "Файл данных (*.xml)|*.xml";
			ДиалогВыбораФайла.Расширение = "xml";
			
		КонецЕсли; 
		
	Иначе
		Если ВыборФайлаПравил Тогда
			ДиалогВыбораФайла.Фильтр = "Файл данных (*.xml)|*.xml";
			ДиалогВыбораФайла.Расширение = "xml";
		Иначе
			ДиалогВыбораФайла.Фильтр = "Файл данных (*.xml)|*.xml|Архивный файл данных (*.zip)|*.zip";
			ДиалогВыбораФайла.Расширение = "xml";
		КонецЕсли;
	КонецЕсли;
	
	ДиалогВыбораФайла.Заголовок = НСтр("ru = 'Выберите файл'");
	ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
	ДиалогВыбораФайла.ИндексФильтра = 0;
	ДиалогВыбораФайла.ПолноеИмяФайла = Элемент.ТекстРедактирования;
	ДиалогВыбораФайла.ПроверятьСуществованиеФайла = ПроверятьСуществование;
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ОбъектХранения", ОбъектХранения);
	ДополнительныеПараметры.Вставить("ИмяСвойства",    ИмяСвойства);
	ДополнительныеПараметры.Вставить("Элемент",        Элемент);
	
	Оповещение = Новый ОписаниеОповещения("ДиалогВыбораФайлаОбработкаВыбора", ЭтотОбъект, ДополнительныеПараметры);
	ДиалогВыбораФайла.Показать(Оповещение);
	
КонецПроцедуры

// Параметры:
//   ВыбранныеФайлы - Массив из Строка - результат выбора файла.
//   ДополнительныеПараметры - Структура - произвольные дополнительные параметры:
//     * ОбъектХранения - Структура
//                      - ФормаКлиентскогоПриложения - приемник для хранения свойства.
//     * ИмяСвойства - Строка - имя свойства объекта хранения.
//     * Элемент - ПолеФормы - источник события выбора файла.
//
&НаКлиенте
Процедура ДиалогВыбораФайлаОбработкаВыбора(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	
	Если ВыбранныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ДополнительныеПараметры.ОбъектХранения[ДополнительныеПараметры.ИмяСвойства] = ВыбранныеФайлы[0];
	
	Элемент = ДополнительныеПараметры.Элемент;
	
	Если Элемент = Элементы.ИмяФайлаПравил Тогда
		ИмяФайлаПравилПриИзменении(Элемент);
	ИначеЕсли Элемент = Элементы.ИмяФайлаОбмена Тогда
		ИмяФайлаОбменаПриИзменении(Элемент);
	ИначеЕсли Элемент = Элементы.ИмяФайлаДанных Тогда
		ИмяФайлаДанныхПриИзменении(Элемент);
	ИначеЕсли Элемент = Элементы.ИмяФайлаПравилЗагрузки Тогда
		ИмяФайлаПравилЗагрузкиПриИзменении(Элемент);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ВыполнитьПодключениеКИБПриемникуНаСервере()
	
	ОбъектДляСервера = РеквизитФормыВЗначение("Объект");
	ЗаполнитьЗначенияСвойств(ОбъектДляСервера, Объект);
	РезультатПодключения = ОбъектДляСервера.ВыполнитьПодключениеКИБПриемнику();
	
	Если РезультатПодключения <> Неопределено Тогда
		
		СообщитьПользователю(НСтр("ru = 'Подключение успешно установлено.'"));
		
	КонецЕсли;
	
КонецПроцедуры

// Устанавливает состояние пометки у подчиненных строк строки дерева значений
// в зависимости от пометки текущей строки.
//
// Параметры:
//  ТекСтрока      - строка дерева значений.
// 
&НаКлиенте
Процедура УстановитьПометкиПодчиненных(ТекСтрока, ИмяФлажка)
	
	Подчиненные = ТекСтрока.ПолучитьЭлементы();
	
	Если Подчиненные.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	Для Каждого Строка Из Подчиненные Цикл
		
		Строка[ИмяФлажка] = ТекСтрока[ИмяФлажка];
		
		УстановитьПометкиПодчиненных(Строка, ИмяФлажка);
		
	КонецЦикла;
		
КонецПроцедуры

// Устанавливает состояние пометки у родительских строк строки дерева значений
// в зависимости от пометки текущей строки.
//
// Параметры:
//  ТекСтрока      - строка дерева значений.
// 
&НаКлиенте
Процедура УстановитьПометкиРодителей(ТекСтрока, ИмяФлажка)
	
	Родитель = ТекСтрока.ПолучитьРодителя();
	Если Родитель = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	
	ТекСостояние = Родитель[ИмяФлажка];
	
	НайденыВключенные  = Ложь;
	НайденыВыключенные = Ложь;
	
	Для Каждого Строка Из Родитель.ПолучитьЭлементы() Цикл
		Если Строка[ИмяФлажка] = 0 Тогда
			НайденыВыключенные = Истина;
		ИначеЕсли Строка[ИмяФлажка] = 1
			ИЛИ Строка[ИмяФлажка] = 2 Тогда
			НайденыВключенные  = Истина;
		КонецЕсли; 
		Если НайденыВключенные И НайденыВыключенные Тогда
			Прервать;
		КонецЕсли; 
	КонецЦикла;
	
	Если НайденыВключенные И НайденыВыключенные Тогда
		Включить = 2;
	ИначеЕсли НайденыВключенные И (Не НайденыВыключенные) Тогда
		Включить = 1;
	ИначеЕсли (Не НайденыВключенные) И НайденыВыключенные Тогда
		Включить = 0;
	ИначеЕсли (Не НайденыВключенные) И (Не НайденыВыключенные) Тогда
		Включить = 2;
	КонецЕсли;
	
	Если Включить = ТекСостояние Тогда
		Возврат;
	Иначе
		Родитель[ИмяФлажка] = Включить;
		УстановитьПометкиРодителей(Родитель, ИмяФлажка);
	КонецЕсли; 
	
КонецПроцедуры

&НаСервере
Процедура ОткрытьФайлЗагрузкиНаСервере(АдресФайла)
	
	Если ЭтоКлиент Тогда
		
		ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайла); // ДвоичныеДанные
		АдресНаСервере = ПолучитьИмяВременногоФайла(".xml");
		// Удаление временного файла происходит не через УдалитьФайлы(АдресНаСервере), а через
		// УдалитьФайлы(Объект.ИмяФайлаОбмена) далее.
		ДвоичныеДанные.Записать(АдресНаСервере);
		Объект.ИмяФайлаОбмена = АдресНаСервере;
		
	Иначе
		
		ФайлНаСервере = Новый Файл(ИмяФайлаОбмена);
		
		Если Не ФайлНаСервере.Существует() Тогда
			
			СообщитьПользователю(НСтр("ru = 'Не найден файл обмена на сервере.'"), "ИмяФайлаОбмена");
			Возврат;
			
		КонецЕсли;
		
		Объект.ИмяФайлаОбмена = ИмяФайлаОбмена;
		
	КонецЕсли;
	
	ОбъектДляСервера = РеквизитФормыВЗначение("Объект");
	
	ОбъектДляСервера.ОткрытьФайлЗагрузки(Истина);
	
	Объект.ДатаНачала = ОбъектДляСервера.ДатаНачала;
	Объект.ДатаОкончания = ОбъектДляСервера.ДатаОкончания;
	Объект.ДатаВыгрузкиДанных = ОбъектДляСервера.ДатаВыгрузкиДанных;
	Объект.ВерсияПравилОбмена = ОбъектДляСервера.ВерсияПравилОбмена;
	Объект.Комментарий = ОбъектДляСервера.Комментарий;
	
КонецПроцедуры

// Удаляет помеченные строки дерева метаданных.
//
&НаСервере
Процедура УдалитьНаСервере()
	
	ОбъектДляСервера = РеквизитФормыВЗначение("Объект");
	ДеревоУдаляемыхДанных = РеквизитФормыВЗначение("УдаляемыеДанные");
	
	ОбъектДляСервера.ИнициализироватьМенеджерыИСообщения();
	
	Для Каждого СтрокаДерева Из ДеревоУдаляемыхДанных.Строки Цикл
		
		Для Каждого СтрокаМД Из СтрокаДерева.Строки Цикл
			
			Если Не СтрокаМД.Пометка Тогда
				Продолжить;
			КонецЕсли;
			
			ТипСтрокой = СтрокаМД.Метаданные;
			ОбъектДляСервера.УдалитьОбъектыТипа(ТипСтрокой);
			
		КонецЦикла;
		
	КонецЦикла;
	
КонецПроцедуры

// Устанавливает узел обмена у строк дерева.
//
&НаСервере
Процедура УстановитьУзелОбменаУСтрокДереваНаСервере(УзелОбмена)
	
	УстановитьУзелОбменаУСтрокДерева(Объект.ТаблицаПравилВыгрузки.ПолучитьЭлементы(), УзелОбмена);
	
КонецПроцедуры

// Сохраняет значения параметров.
//
&НаСервере
Процедура СохранитьПараметрыНаСервере()
	
	ТаблицаПараметров = РеквизитФормыВЗначение("Объект.ТаблицаНастройкиПараметров");
	
	СохраняемыеПараметры = Новый Соответствие;
	
	Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл
		СохраняемыеПараметры.Вставить(СтрокаТаблицы.Наименование, СтрокаТаблицы.Значение);
	КонецЦикла;
	
	ХранилищеСистемныхНастроек.Сохранить("УниверсальныйОбменДаннымиXML", "Параметры", СохраняемыеПараметры);
	
КонецПроцедуры

// Восстанавливает значения параметров.
//
&НаСервере
Процедура ВосстановитьПараметрыНаСервере()
	
	ТаблицаПараметров = РеквизитФормыВЗначение("Объект.ТаблицаНастройкиПараметров");
	ВосстановленныеПараметры = ХранилищеСистемныхНастроек.Загрузить("УниверсальныйОбменДаннымиXML", "Параметры");
	
	Если ТипЗнч(ВосстановленныеПараметры) <> Тип("Соответствие") Тогда
		Возврат;
	КонецЕсли;
	
	Если ВосстановленныеПараметры.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	Для Каждого Парам Из ВосстановленныеПараметры Цикл
		
		ИмяПараметра = Парам.Ключ;
		
		СтрокаТаблицы = ТаблицаПараметров.Найти(Парам.Ключ, "Наименование");
		
		Если СтрокаТаблицы <> Неопределено Тогда
			
			СтрокаТаблицы.Значение = Парам.Значение;
			
		КонецЕсли;
		
	КонецЦикла;
	
	ЗначениеВРеквизитФормы(ТаблицаПараметров, "Объект.ТаблицаНастройкиПараметров");
	
КонецПроцедуры

// Интерактивная выгрузка данных.
//
&НаКлиенте
Процедура ВыполнитьЗагрузкуИзФормы()
	
	АдресФайла = "";
	ИмяФайлаДляРасширения = "";
	
	ДобавитьСтрокуКСпискуВыбора(Элементы.ИмяФайлаОбмена.СписокВыбора, ИмяФайлаОбмена, ЗагрузкаДанныхИхФайла);
	
	Если ЭтоКлиент Тогда
		
		ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьЗагрузкуИзФормыЗавершение", ЭтотОбъект);
		НачатьПомещениеФайла(ОписаниеОповещения, АдресФайла, , , УникальныйИдентификатор);
		
	Иначе
		
		Если ПустоеЗначениеРеквизита(ИмяФайлаОбмена, "ИмяФайлаОбмена", Элементы.ИмяФайлаОбмена.Заголовок) Тогда
			Возврат;
		КонецЕсли;
		
		ВыполнитьЗагрузкуИзФормыЗавершение(Истина, АдресФайла, ИмяФайлаДляРасширения, Неопределено);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьЗагрузкуИзФормыЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
	
	Если Результат Тогда
		
		ВыполнитьЗагрузкуНаСервере(Адрес, ВыбранноеИмяФайла);
		
		ОткрытьДанныеПротоколовОбменаПриНеобходимости();
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ВыполнитьЗагрузкуНаСервере(АдресФайла, ИмяФайлаДляРасширения)
	
	ИмяЗагружаемогоФайла = ИмяФайлаНаСервереИлиКлиенте(ИмяФайлаОбмена ,АдресФайла, ИмяФайлаДляРасширения);
	
	Если ИмяЗагружаемогоФайла = Неопределено Тогда
		
		Возврат;
		
	Иначе
		
		Объект.ИмяФайлаОбмена = ИмяЗагружаемогоФайла;
		
	КонецЕсли;
	
	Если Объект.БезопаснаяЗагрузка Тогда
		Если ЭтоАдресВременногоХранилища(АдресФайлаПравилЗагрузкиВХранилище) Тогда
			ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайлаПравилЗагрузкиВХранилище); // ДвоичныеДанные
			АдресНаСервере = ПолучитьИмяВременногоФайла("xml");
			// Удаление временного файла происходит не через УдалитьФайлы(АдресНаСервере), а через
			// УдалитьФайлы(Объект.ИмяФайлаПравилОбмена) далее.
			ДвоичныеДанные.Записать(АдресНаСервере);
			Объект.ИмяФайлаПравилОбмена = АдресНаСервере;
		Иначе
			СообщитьПользователю(НСтр("ru = 'Не указан файл правил для загрузки данных.'"));
			Возврат;
		КонецЕсли;
	КонецЕсли;
	
	ОбъектДляСервера = РеквизитФормыВЗначение("Объект");
	ЗаполнитьЗначенияСвойств(ОбъектДляСервера, Объект);
	ОбъектДляСервера.ВыполнитьЗагрузку();
	
	Попытка
		
		Если Не ПустаяСтрока(АдресФайла) Тогда
			УдалитьФайлы(ИмяЗагружаемогоФайла);
		КонецЕсли;
		
	Исключение
		ЗаписьЖурналаРегистрации(НСтр("ru = 'Универсальный обмен данными в формате XML'", ОбъектДляСервера.КодОсновногоЯзыка()),
			УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
	КонецПопытки;
	
	ОбъектДляСервера.Параметры.Очистить();
	ЗначениеВРеквизитФормы(ОбъектДляСервера, "Объект");
	
	ПравилаЗагружены = Ложь;
	Элементы.ФормаВыполнитьВыгрузку.Доступность = Ложь;
	Элементы.НадписьПояснениеВыгрузки.Видимость = Истина;
	Элементы.ГруппаВыгрузкаОтладкаДоступна.Доступность = Ложь;
	
КонецПроцедуры

&НаСервере
Функция ИмяФайлаНаСервереИлиКлиенте(ИмяРеквизита ,Знач АдресФайла, Знач ИмяФайлаДляРасширения = ".xml",
	СоздатьНовый = Ложь, ПроверятьСуществование = Истина)
	
	ИмяФайла = Неопределено;
	
	Если ЭтоКлиент Тогда
		
		Если СоздатьНовый Тогда
			
			Расширение = ? (Объект.АрхивироватьФайл, ".zip", ".xml");
			
			ИмяФайла = ПолучитьИмяВременногоФайла(Расширение);
			
		Иначе
			
			Расширение = РасширениеФайла(ИмяФайлаДляРасширения);
			ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайла); // ДвоичныеДанные
			АдресНаСервере = ПолучитьИмяВременногоФайла(Расширение);
			// Удаление временного файла происходит не через УдалитьФайлы(АдресНаСервере),
			// а через УдалитьФайлы(Объект.ИмяФайлаПравилОбмена) и УдалитьФайлы(Объект.ИмяФайлаОбмена) далее.
			ДвоичныеДанные.Записать(АдресНаСервере);
			ИмяФайла = АдресНаСервере;
			
		КонецЕсли;
		
	Иначе
		
		ФайлНаСервере = Новый Файл(ИмяРеквизита);
		
		Если Не ФайлНаСервере.Существует() И ПроверятьСуществование Тогда
			
			СообщитьПользователю(НСтр("ru = 'Указанный файл не существует.'"));
			
		Иначе
			
			ИмяФайла = ИмяРеквизита;
			
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат ИмяФайла;
	
КонецФункции

&НаСервере
Функция РасширениеФайла(Знач ИмяФайла)
	
	ПозицияТочки = ПоследнийРазделитель(ИмяФайла);
	
	Расширение = Прав(ИмяФайла,СтрДлина(ИмяФайла) - ПозицияТочки + 1);
	
	Возврат Расширение;
	
КонецФункции

&НаСервере
Функция ПоследнийРазделитель(СтрокаСРазделителем, Разделитель = ".")
	
	ДлинаСтроки = СтрДлина(СтрокаСРазделителем);
	
	Пока ДлинаСтроки > 0 Цикл
		
		Если Сред(СтрокаСРазделителем, ДлинаСтроки, 1) = Разделитель Тогда
			
			Возврат ДлинаСтроки; 
			
		КонецЕсли;
		
		ДлинаСтроки = ДлинаСтроки - 1;
		
	КонецЦикла;

КонецФункции

&НаКлиенте
Процедура ВыполнитьВыгрузкуИзФормы()
	
	// Запомним файл правил и файл выгрузки.
	ДобавитьСтрокуКСпискуВыбора(Элементы.ИмяФайлаПравил.СписокВыбора, ИмяФайлаПравил, ПравилаОбмена);
	
	Если Не Объект.НепосредственноеЧтениеВИБПриемнике И Не ЭтоКлиент Тогда
		
		Если ИменаФайловПравилИОбменаСовпадают() Тогда
			Возврат;
		КонецЕсли;
		
		ДобавитьСтрокуКСпискуВыбора(Элементы.ИмяФайлаДанных.СписокВыбора, ИмяФайлаДанных, ВыгрузкаДанныхВФайл);
		
	КонецЕсли;
	
	АдресФайлаДанныхВХранилище = ВыполнитьВыгрузкуНаСервере();
	
	Если АдресФайлаДанныхВХранилище = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	РазвернутьСтрокиДерева(Объект.ТаблицаПравилВыгрузки, Элементы.ТаблицаПравилВыгрузки, "Включить");
	
	Если ЭтоКлиент И Не ПрямаяВыгрузка И Не Объект.ФлагОшибки Тогда
		
		ИмяСохраняемогоФайла = ?(Объект.АрхивироватьФайл, НСтр("ru = 'Файл выгрузки.zip'"),НСтр("ru = 'Файл выгрузки.xml'"));
		
		ПолучитьФайл(АдресФайлаДанныхВХранилище, ИмяСохраняемогоФайла)
		
	КонецЕсли;
	
	ОткрытьДанныеПротоколовОбменаПриНеобходимости();
	
КонецПроцедуры

&НаСервере
Функция ВыполнитьВыгрузкуНаСервере()
	
	Объект.ИмяФайлаПравилОбмена = ИмяФайлаНаСервереИлиКлиенте(ИмяФайлаПравил, АдресФайлаПравилВХранилище);
	
	Если Не ПрямаяВыгрузка Тогда
		
		ИмяВременногоФайлаДанных = ИмяФайлаНаСервереИлиКлиенте(ИмяФайлаДанных, "",,Истина, Ложь);
		
		Если ИмяВременногоФайлаДанных = Неопределено Тогда
			
			СообщитьПользователю(НСтр("ru = 'Не определен файл данных'"));
			Возврат Неопределено;
			
		Иначе
			
			Объект.ИмяФайлаОбмена = ИмяВременногоФайлаДанных;
			
		КонецЕсли;
		
	КонецЕсли;
	
	ТаблицаПравилВыгрузки = РеквизитФормыВЗначение("Объект.ТаблицаПравилВыгрузки");
	ТаблицаНастройкиПараметров = РеквизитФормыВЗначение("Объект.ТаблицаНастройкиПараметров");
	
	ОбъектДляСервера = РеквизитФормыВЗначение("Объект");
	ЗаполнитьЗначенияСвойств(ОбъектДляСервера, Объект);
	
	Если ОбъектДляСервера.ФлагРежимОтладкиОбработчиков Тогда
		
		Отказ = Ложь;
		
		Файл = Новый Файл(ОбъектДляСервера.ИмяФайлаВнешнейОбработкиОбработчиковСобытий);
		
		Если Не Файл.Существует() Тогда
			
			СообщитьПользователю(НСтр("ru = 'Файл внешней обработки отладчиков событий не существует на сервере'"));
			Возврат Неопределено;
			
		КонецЕсли;
		
		ОбъектДляСервера.ВыгрузитьОбработчикиСобытий(Отказ);
		
		Если Отказ Тогда
			
			СообщитьПользователю(НСтр("ru = 'Не удалось выгрузить обработчики событий'"));
			Возврат "";
			
		КонецЕсли;
		
	Иначе
		
		ОбъектДляСервера.ЗагрузитьПравилаОбмена();
		ОбъектДляСервера.ИнициализироватьПервоначальныеЗначенияПараметров();
		
	КонецЕсли;
	
	ИзменитьДеревоПравилВыгрузки(ОбъектДляСервера.ТаблицаПравилВыгрузки.Строки, ТаблицаПравилВыгрузки.Строки);
	ИзменитьТаблицуПараметров(ОбъектДляСервера.ТаблицаНастройкиПараметров, ТаблицаНастройкиПараметров);
	
	ОбъектДляСервера.ВыполнитьВыгрузку();
	ОбъектДляСервера.ТаблицаПравилВыгрузки = РеквизитФормыВЗначение("Объект.ТаблицаПравилВыгрузки");
	
	Если ЭтоКлиент И Не ПрямаяВыгрузка Тогда
		
		АдресФайлаДанных = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(Объект.ИмяФайлаОбмена), УникальныйИдентификатор);
		УдалитьФайлы(Объект.ИмяФайлаОбмена);
		
	Иначе
		
		АдресФайлаДанных = "";
		
	КонецЕсли;
	
	Если ЭтоКлиент Тогда
		
		УдалитьФайлы(ОбъектДляСервера.ИмяФайлаПравилОбмена);
		
	КонецЕсли;
	
	ОбъектДляСервера.Параметры.Очистить();
	ЗначениеВРеквизитФормы(ОбъектДляСервера, "Объект");
	
	Возврат АдресФайлаДанных;
	
КонецФункции

&НаКлиенте
Процедура УстановитьДоступностьКомандОтладки()
	
	Элементы.НастройкаОтладкиЗагрузки.Доступность = Объект.ФлагРежимОтладкиОбработчиков;
	Элементы.НастройкаОтладкиВыгрузки.Доступность = Объект.ФлагРежимОтладкиОбработчиков;
	
КонецПроцедуры

// Изменяет дерево ПВД в соответствии с деревом на форме.
//
&НаСервере
Процедура ИзменитьДеревоПравилВыгрузки(СтрокиИсходногоДерева, СтрокиЗаменяемогоДерева)
	
	КолонкаВключить = СтрокиЗаменяемогоДерева.ВыгрузитьКолонку("Включить");
	СтрокиИсходногоДерева.ЗагрузитьКолонку(КолонкаВключить, "Включить");
	КолонкаУзел = СтрокиЗаменяемогоДерева.ВыгрузитьКолонку("СсылкаНаУзелОбмена");
	СтрокиИсходногоДерева.ЗагрузитьКолонку(КолонкаУзел, "СсылкаНаУзелОбмена");
	
	Для Каждого СтрокаИсходногоДерева Из СтрокиИсходногоДерева Цикл
		
		ИндексСтроки = СтрокиИсходногоДерева.Индекс(СтрокаИсходногоДерева);
		СтрокаИзменяемогоДерева = СтрокиЗаменяемогоДерева.Получить(ИндексСтроки);
		
		ИзменитьДеревоПравилВыгрузки(СтрокаИсходногоДерева.Строки, СтрокаИзменяемогоДерева.Строки);
		
	КонецЦикла;
	
КонецПроцедуры

// Изменяет таблицу параметров в соответствии с таблицей на форме.
//
&НаСервере
Процедура ИзменитьТаблицуПараметров(ТаблицаБазы, ТаблицаФормы)
	
	КолонкаНаименование = ТаблицаФормы.ВыгрузитьКолонку("Наименование");
	ТаблицаБазы.ЗагрузитьКолонку(КолонкаНаименование, "Наименование");
	КолонкаЗначение = ТаблицаФормы.ВыгрузитьКолонку("Значение");
	ТаблицаБазы.ЗагрузитьКолонку(КолонкаЗначение, "Значение");
	
КонецПроцедуры

&НаКлиенте
Процедура ПрямаяВыгрузкаПриИзмененииЗначения()
	
	ПараметрыВыгрузки = Элементы.ПараметрыВыгрузки;
	
	ПараметрыВыгрузки.ТекущаяСтраница = ?(ПрямаяВыгрузка = 0,
										  ПараметрыВыгрузки.ПодчиненныеЭлементы.ВыгрузкаВФайл,
										  ПараметрыВыгрузки.ПодчиненныеЭлементы.ВыгрузкаВИБПриемник);
	
	Объект.НепосредственноеЧтениеВИБПриемнике = (ПрямаяВыгрузка = 1);
	
	ТипИнформационнойБазыДляПодключенияПриИзмененииЗначения();
	
КонецПроцедуры

&НаКлиенте
Процедура ТипИнформационнойБазыДляПодключенияПриИзмененииЗначения()
	
	ТипБазы = Элементы.ТипБазы;
	ТипБазы.ТекущаяСтраница = ?(Объект.ТипИнформационнойБазыДляПодключения,
								ТипБазы.ПодчиненныеЭлементы.ФайловаяБаза,
								ТипБазы.ПодчиненныеЭлементы.БазаНаСервере);
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьСтрокуКСпискуВыбора(СписокСохраняемыхЗначений, ЗначениеСохранения, ИмяПараметраДляСохранения)
	
	Если ПустаяСтрока(ЗначениеСохранения) Тогда
		Возврат;
	КонецЕсли;
	
	НайденныйЭлемент = СписокСохраняемыхЗначений.НайтиПоЗначению(ЗначениеСохранения);
	Если НайденныйЭлемент <> Неопределено Тогда
		СписокСохраняемыхЗначений.Удалить(НайденныйЭлемент);
	КонецЕсли;
	
	СписокСохраняемыхЗначений.Вставить(0, ЗначениеСохранения);
	
	Пока СписокСохраняемыхЗначений.Количество() > 10 Цикл
		СписокСохраняемыхЗначений.Удалить(СписокСохраняемыхЗначений.Количество() - 1);
	КонецЦикла;
	
	ИмяПараметраДляСохранения = СписокСохраняемыхЗначений;
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФормуНастройкиОтладкиОбработчиков(ОбработчикиСобытийИзФайлаПравил)
	
	ИмяОбработки = Лев(ИмяФормы, ПоследнийРазделитель(ИмяФормы));
	ИмяВызываемойФормы = ИмяОбработки + "УправляемаяФормаНастройкиОтладкиОбработчиков";
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ИмяФайлаВнешнейОбработкиОбработчиковСобытий", Объект.ИмяФайлаВнешнейОбработкиОбработчиковСобытий);
	ПараметрыФормы.Вставить("РежимОтладкиАлгоритмов", Объект.РежимОтладкиАлгоритмов);
	ПараметрыФормы.Вставить("ИмяФайлаПравилОбмена", Объект.ИмяФайлаПравилОбмена);
	ПараметрыФормы.Вставить("ИмяФайлаОбмена", Объект.ИмяФайлаОбмена);
	ПараметрыФормы.Вставить("ОбработчикиСобытийЧитаемИзФайлаПравилОбмена", ОбработчикиСобытийИзФайлаПравил);
	ПараметрыФормы.Вставить("ИмяОбработки", ИмяОбработки);
	
	Режим = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
	Обработчик = Новый ОписаниеОповещения("ОткрытьФормуНастройкиОтладкиОбработчиковЗавершение", ЭтотОбъект, ОбработчикиСобытийИзФайлаПравил);
	
	ОткрытьФорму(ИмяВызываемойФормы, ПараметрыФормы, ЭтотОбъект,,,,Обработчик, Режим);
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФормуНастройкиОтладкиОбработчиковЗавершение(ПараметрыОтладки, ОбработчикиСобытийИзФайлаПравил) Экспорт
	
	Если ПараметрыОтладки <> Неопределено Тогда
		
		ЗаполнитьЗначенияСвойств(Объект, ПараметрыОтладки);
		
		Если ЭтоКлиент Тогда
			
			Если ОбработчикиСобытийИзФайлаПравил Тогда
				
				ИмяФайла = Объект.ИмяФайлаПравилОбмена;
				
			Иначе
				
				ИмяФайла = Объект.ИмяФайлаОбмена;
				
			КонецЕсли;
			
			Оповещение = Новый ОписаниеОповещения("ОткрытьФормуНастройкиОтладкиОбработчиковЗавершениеУдалениеФайлов", ЭтотОбъект);
			НачатьУдалениеФайлов(Оповещение, ИмяФайла);
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФормуНастройкиОтладкиОбработчиковЗавершениеУдалениеФайлов(ДополнительныеПараметры) Экспорт
	
	Возврат;
	
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьРасположениеФайла()
	
	Элементы.ИмяФайлаПравил.Видимость = Не ЭтоКлиент;
	Элементы.ИмяФайлаДанных.Видимость = Не ЭтоКлиент;
	Элементы.ИмяФайлаОбмена.Видимость = Не ЭтоКлиент;
	Элементы.ГруппаБезопаснаяЗагрузка.Видимость = Не ЭтоКлиент;
	
	УстановитьПризнакЗагрузкиПравил(Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьРежимОбработки(РежимРаботы)
	
	ГруппаРежима = КоманднаяПанель.ПодчиненныеЭлементы.РежимОбработки.ПодчиненныеЭлементы;
	
	ГруппаРежима.ФормаНаКлиенте.Пометка = РежимРаботы;
	ГруппаРежима.ФормаНаСервере.Пометка = Не РежимРаботы;
	
	КоманднаяПанель.ПодчиненныеЭлементы.РежимОбработки.Заголовок = 
	?(РежимРаботы, НСтр("ru = 'Режим работы (на клиенте)'"), НСтр("ru = 'Режим работы (на сервере)'"));
	
	Объект.ТаблицаПравилВыгрузки.ПолучитьЭлементы().Очистить();
	Объект.ТаблицаНастройкиПараметров.Очистить();
	
	ИзменитьРасположениеФайла();
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьДанныеПротоколовОбменаПриНеобходимости()
	
	Если НЕ Объект.ОткрыватьПротоколыОбменаПослеВыполненияОпераций Тогда
		Возврат;
	КонецЕсли;
	
	#Если Не ВебКлиент Тогда
		
		Если Не ПустаяСтрока(Объект.ИмяФайлаПротоколаОбмена) Тогда
			ОткрытьВПриложении(Объект.ИмяФайлаПротоколаОбмена);
		КонецЕсли;
		
		Если Объект.НепосредственноеЧтениеВИБПриемнике Тогда
			
			Объект.ИмяФайлаПротоколаОбменаЗагрузка = ПолучитьИмяПротоколаДляВторойИнформационнойБазыComСоединенияНаСервере();
			
			Если Не ПустаяСтрока(Объект.ИмяФайлаПротоколаОбменаЗагрузка) Тогда
				ОткрытьВПриложении(Объект.ИмяФайлаПротоколаОбменаЗагрузка);
			КонецЕсли;
			
		КонецЕсли;
		
	#КонецЕсли
	
КонецПроцедуры

&НаСервере
Функция ПолучитьИмяПротоколаДляВторойИнформационнойБазыComСоединенияНаСервере()
	
	Возврат РеквизитФормыВЗначение("Объект").ПолучитьИмяПротоколаДляВторойИнформационнойБазыComСоединения();
	
КонецФункции

&НаКлиенте
Функция ПустоеЗначениеРеквизита(Реквизит, ПутьКДанным, Заголовок)
	
	Если ПустаяСтрока(Реквизит) Тогда
		
		ТекстСообщения = НСтр("ru = 'Поле ""%1"" не заполнено'");
		ТекстСообщения = СтрЗаменить(ТекстСообщения, "%1", Заголовок);
		
		СообщитьПользователю(ТекстСообщения, ПутьКДанным);
		
		Возврат Истина;
		
	Иначе
		
		Возврат Ложь;
		
	КонецЕсли;
	
КонецФункции

&НаКлиенте
Процедура УстановитьПризнакЗагрузкиПравил(Признак)
	
	ПравилаЗагружены = Признак;
	Элементы.ФормаВыполнитьВыгрузку.Доступность = Признак;
	Элементы.НадписьПояснениеВыгрузки.Видимость = Не Признак;
	Элементы.ГруппаОтладкиВыгрузки.Доступность = Признак;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененииТипаУдаленияРегистрацииИзменений()
	
	Если ПустаяСтрока(ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки) Тогда
		Объект.ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки = 0;
	Иначе
		Объект.ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки = Число(ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура СообщитьПользователю(Текст, ПутьКДанным = "")
	
	Сообщение = Новый СообщениеПользователю;
	Сообщение.Текст = Текст;
	Сообщение.ПутьКДанным = ПутьКДанным;
	Сообщение.Сообщить();
	
КонецПроцедуры

// Возвращает Истина, если клиентское приложение запущено под управлением ОС Windows.
//
// Возвращаемое значение:
//  Булево -  если нет клиентского приложения, возвращается Ложь.
//
&НаКлиенте
Функция ЭтоWindowsКлиент()
	
	СистемнаяИнформация = Новый СистемнаяИнформация;
	
	ЭтоWindowsКлиент = СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86
	             ИЛИ СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64;
	
	Возврат ЭтоWindowsКлиент;
	
КонецФункции

&НаСервере
Процедура ПроверитьВерсиюИРежимСовместимостиПлатформы()
	
	Информация = Новый СистемнаяИнформация;
	Если Не (Лев(Информация.ВерсияПриложения, 3) = "8.3"
		И (Метаданные.РежимСовместимости = Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать
		Или (Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.Версия8_1
		И Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.Версия8_2_13
		И Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости["Версия8_2_16"]
		И Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости["Версия8_3_1"]
		И Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости["Версия8_3_2"]))) Тогда
		
		ВызватьИсключение НСтр("ru = 'Обработка предназначена для запуска на версии платформы
			|1С:Предприятие 8.3 с отключенным режимом совместимости или выше'");
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьРежимБезопаснаяЗагрузка(Интерактивно = Истина)
	
	Элементы.ГруппаБезопаснаяЗагрузка.Доступность = Объект.БезопаснаяЗагрузка;
	
	ЧерезХранилище = ЭтоКлиент;
	#Если ВебКлиент Тогда
		ЧерезХранилище = Истина;
	#КонецЕсли
	
	Если Объект.БезопаснаяЗагрузка И ЧерезХранилище Тогда
		ПоместитьФайлПравилЗагрузкиВХранилище();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПоместитьФайлПравилЗагрузкиВХранилище()
	
	ЧерезХранилище = ЭтоКлиент;
	#Если ВебКлиент Тогда
		ЧерезХранилище = Истина;
	#КонецЕсли
	
	АдресФайла = "";
	ОписаниеОповещения = Новый ОписаниеОповещения("ПоместитьФайлПравилЗагрузкиВХранилищеЗавершить", ЭтотОбъект);
	
	Если ЧерезХранилище Тогда
		НачатьПомещениеФайла(ОписаниеОповещения, АдресФайла, , , УникальныйИдентификатор);
	Иначе
		НачатьПомещениеФайла(ОписаниеОповещения, АдресФайла, ИмяФайлаПравилЗагрузки, Ложь, УникальныйИдентификатор);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПоместитьФайлПравилЗагрузкиВХранилищеЗавершить(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
	
	Если Результат Тогда
		АдресФайлаПравилЗагрузкиВХранилище = Адрес;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти